package cloud.seri.iot.aliyun.web.rest

import cloud.seri.iot.aliyun.service.DeviceManagerService
import cloud.seri.iot.common.api.DeviceManager
import cloud.seri.iot.common.model.DeviceDTO
import cloud.seri.iot.common.model.QueryDeviceDTO
import cloud.seri.iot.common.model.RegisterDevice
import com.aliyuncs.iot.model.v20180120.*
import io.swagger.annotations.Api
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.*

/**
 * DeviceManagerResource controller
 */
@RestController
@RequestMapping("/api/devices")
@Api(tags = ["设备管理"])
class DeviceManagerResource(private val deviceManagerService: DeviceManagerService) : DeviceManager
{
    /**
     * 注册设备
     *
     * @param pk         产品名称  必须
     * @param DeviceName            设备命名  非必须
     * @return 产品创建信息
     */
    @PostMapping("/register")
    override fun registerDevice(@RequestBody dto: RegisterDevice): RegisterDeviceResponse?
    {
        log.info("创建设备 $dto")
        return deviceManagerService.registerDevice(dto)
    }

    /**
     * 删除设备。
     *
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @param IotId            设备ID    非必须
     * @return 产品创建信息
     */
    @DeleteMapping
    override fun deleteDevice(dto: DeviceDTO): DeleteDeviceResponse?
    {
        log.debug("删除设备 $dto")
        return deviceManagerService.deleteDevice(dto)
    }

    /**
     * 查询指定设备的详细信息
     *
     * @param IotId                 设备ID  非必须
     * @param pk            设备所隶属的产品Key。  非必须
     * @param DeviceName            设备名  非必须
     * @return 产品创建信息
     */
    @GetMapping("/detail")
    override fun queryDeviceDetail(dto: DeviceDTO): QueryDeviceDetailResponse?
    {
        log.debug(" 查询指定设备的详细信息 DTO:$dto")
        return deviceManagerService.queryDeviceDetail(dto)
    }

    /**
     * 查询指定产品下的所有设备列表。
     *
     * @param pk         产品名称  必须
     * @param PageSize            设备命名  非必须
     * @param CurrentPage            设备命名  非必须
     * @return 产品创建信息
     */
    @GetMapping
    override fun queryDevice(dto: QueryDeviceDTO): QueryDeviceResponse?
    {
        return deviceManagerService.queryDevice(dto)
    }

    /**
     * 批量注册多个设备
     *
     * @param pk       产品名称  必须
     * @param Count       设备的数量 必须
     *
     * @Des 描述：
     */
    @PostMapping("/batch-register")
    override fun batchRegisterDevice(pk: String, count: Int?): BatchRegisterDeviceResponse?
    {
        return deviceManagerService.batchRegisterDevice(pk, count)
    }

    /**
     * 在指定产品下批量自定义设备名称
     *
     * @param pk       产品名称  非必须
     * @param DeviceNames       设备的名称  非必须
     * 描述：
     * 该接口需要和BatchRegisterDeviceWithApplyId接口结合使用，实现在一个产品下批量注册（即新建）
     * 多个设备，并且为每个设备单独命名。单次调用，最多能传入1,000 个设备名称。
     */
    @PostMapping("/batch-check-device-names")
    override fun batchCheckDeviceNames(pk: String, @RequestBody DeviceNames: List<String>): BatchCheckDeviceNamesResponse?
    {
        return deviceManagerService.batchCheckDeviceNames(pk, DeviceNames)
    }

    /**
     * 根据申请批次ID（ApplyId）批量注册设备
     *
     * @param pk       产品名称  必须
     * @param ApplyId       要批量注册的设备的申请批次ID。申请批次ID由调用BatchCheckDeviceNames接口返回。  必须
     *
     * @Des 描述：
     * 该接口需要和BatchCheckDeviceNames接口结合使用，实现在一个产品下批量注册（即新建）多个设备，并且为每个设备单独命名。
     */
    @GetMapping("/batch-register-device-with-applyId")
    override fun batchRegisterDeviceWithApplyId(pk: String, ApplyId: Long?): BatchRegisterDeviceWithApplyIdResponse?
    {
        return deviceManagerService.batchRegisterDeviceWithApplyId(pk, ApplyId)
    }

    /**
     * 查询批量注册设备申请的处理状态和结果
     *
     * @param pk       产品名称  必须
     * @param ApplyId       设备的数量 必须
     *
     * @Des 描述：
     */
    @GetMapping("/query-batch-register-device-status")
    override fun queryBatchRegisterDeviceStatus(pk: String, ApplyId: Long?): QueryBatchRegisterDeviceStatusResponse?
    {
        return deviceManagerService.queryBatchRegisterDeviceStatus(pk, ApplyId)
    }

    /**
     * 查询批量注册的设备信息
     *
     * @param ApplyId       产品名称  必须
     * @param PageSize         必须
     * @param CurrentPage             必须
     *
     * @Des 描述：
     */
    @GetMapping("/query-page-applyId")
    override fun queryPageByApplyId(ApplyId: Long?, PageSize: Int?, CurrentPage: Int?): QueryPageByApplyIdResponse?
    {
        return deviceManagerService.queryPageByApplyId(ApplyId, PageSize, CurrentPage)
    }

    /**
     * 查询指定产品下的设备统计数据
     *
     * @param pk 设备所隶属的产品Key
     *
     * @Des 描述：
     */
    @GetMapping("/query-device-statistics")
    override fun queryDeviceStatistics(pk: String): QueryDeviceStatisticsResponse?
    {
        return deviceManagerService.queryDeviceStatistics(pk)
    }

    /**
     * 查看指定设备的运行状态
     *
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @param IotId            设备ID    非必须
     * @return 产品创建信息
     */
    @GetMapping("/device-status")
    override fun getDeviceStatus(pk: String, DeviceName: String?, IotId: String?): GetDeviceStatusResponse?
    {
        return deviceManagerService.getDeviceStatus(pk, DeviceName, IotId)
    }

    /**
     * 批量查看指定设备的运行状态
     *
     * @param pk       产品名称  非必须
     * @param DeviceNames       设备的名称  非必须
     * @return 产品创建信息
     */
    @GetMapping("/batch-device-state")
    override fun batchGetDeviceState(pk: String, DeviceNames: List<String>): BatchGetDeviceStateResponse?
    {
        return deviceManagerService.batchGetDeviceState(pk, DeviceNames)
    }

    /**
     * 禁用指定设备
     *
     * @param IotId       设备的名称  非必须
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @return 产品创建信息
     */
    @PostMapping("/disable")
    override fun disableThing(@RequestBody dto: DeviceDTO): DisableThingResponse?
    {
        return deviceManagerService.disableThing(dto)
    }

    /**
     * 启用指定设备
     *
     * @param IotId       设备的名称  非必须
     * @param pk       产品名称  非必须
     * @param DeviceName       设备的名称  非必须
     * @return 产品创建信息
     */
    @PostMapping("/enable")
    override fun enableThing(@RequestBody dto: DeviceDTO): EnableThingResponse?
    {
        return deviceManagerService.enableThing(dto)
    }

    private val log = LoggerFactory.getLogger(this.javaClass)


}
